home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / edit / agmsrecordsound.lzh / AGMSRecordSound.doc < prev    next >
Text File  |  1991-06-16  |  15KB  |  305 lines

  1. AGMSRecordSound is a Modula-2 program which records sound samples to
  2. disk, using a standard parallel port audio digitizer.  AGMSRecordSoundPS3
  3. is a modified version that works with version 3.0+ PerfectSound hardware. 
  4.  
  5. To get you started, try this command:
  6.  
  7.   AGMSRecordSound ram:test verbose
  8.  
  9. Type a control-C to stop it.
  10.  
  11.  
  12. Propoganda
  13.  
  14. Since AGMSRecordSound doesn't need to fit the whole sample into one
  15. contiguous memory block, you can record samples longer than your memory
  16. size (up to 2 gigabytes).  It also multi-tasks so you can see the screen
  17. and do other things while recording, unlike all other sound digitizer
  18. programs I know of.
  19.  
  20. Anti-propoganda
  21.  
  22. The downside of this is crummy audio quality.  Other digitizers take
  23. over the computer while recording since that is the best way to get
  24. better quality.  The trouble comes from code that temporarily disables
  25. interrupts, making AGMSRecordSound's interrupt routine miss a sound
  26. sample.  This happens all time time - whenever memory is allocated or
  27. deallocated, interrupts are disabled to prevent other programs from
  28. interfering.  Hopefully Commodore will put in some DMA circuits for
  29. digitizing so that we can get good quality and multitasking.
  30.  
  31. Requirements
  32.  
  33. AGMSRecordSound requires sound sampler hardware plugged into the
  34. parallel port.  I've tested it with AMAS (records from the right
  35. channel) and it should work with most other parallel port digitizers
  36. (try left if right doesn't work).  If you have SunRize Industries'
  37. PerfectSound 3 digitizer then you have to use a different version of
  38. this program: AGMSPlaySoundPS3.  You also need to have the arp.library
  39. file (version 39 or 1.3) in your LIBS: directory.  Other than that, it
  40. should work on all Amigas. 
  41.  
  42. How It Works
  43.  
  44. An interrupt routine is set up for audio channel 1 (right side) that
  45. samples the parallel port, copies the data to the audio register and
  46. copies it to a buffer in memory.  Every time audio channel 1 needs a new
  47. sound sample, this interrupt routine is called.  When a buffer becomes
  48. full, it moves to the next buffer and signals the main program.  If
  49. there are no empty buffers to be filled, the interrupt routine will slow
  50. down the audio channel to a lower sampling rate (around 440 Hz) so that
  51. the processor will have more CPU time for running tasks (less used by
  52. the interrupt code).  You can still hear the sounds but they won't be
  53. stored in the buffer (not recorded in other words) and they will sound
  54. strange (like a dog growling under water) due to the lower sampling
  55. rate.  When an empty buffer becomes available, it will resume filling at
  56. normal speed. 
  57.  
  58. The other half of AGMSRecordSound is a process that dumps filled buffers
  59. to a disk file.  If it is faster at emptying buffers than the interrupt
  60. routine is at filling them, it will go to sleep and wait for a signal:
  61. control-C (a signal from the user to stop recording) and control-F (a
  62. signal from the interrupt routine that another buffer is full).  In the
  63. PerfectSound version, it also responds to control-E (steps up the volume
  64. control). 
  65.  
  66. Sound Quality
  67.  
  68. The problems with disabled interrupts cause pops and similar noises -
  69. great if you are trying to simulate an old scratchy record (or to record
  70. one), but otherwise annoying.  The trick for getting "good" sound
  71. quality is to set the sampling rate to minimize this problem.
  72.  
  73. A really low sampling rate means that the disabled interrupt won't last
  74. long enough to cause trouble.  After interrupts are re-enabled, the
  75. pending audio interrupt will get through and the sample will only be
  76. delayed in time for a short while.  Samples after the delayed one will
  77. be back on schedule.  Unfortunately, most people don't like to record at
  78. 1kHz :-).  However, if you have a faster computer (I only have an A2000)
  79. then the disabled times will be shorter and sound quality should go up. 
  80.  
  81. A really high sampling rate will suck up so much CPU time that only the
  82. interrupt routine will be running; every time it finishes sampling,
  83. another interrupt comes in.  This is actually quite useful (more later).
  84. You can tell that this is happening by the lack of mouse pointer
  85. movement when you move the mouse.  However, as soon as all the buffers
  86. are full, the interrupt routine will go into idle mode.  This frees up
  87. CPU cycles for running other tasks - like the mouse pointer movement and
  88. buffer saving.  As soon as one buffer has been saved, the interrupt
  89. routine will pick up speed and things will be frozen.
  90.  
  91. At high sampling rates, no other task is running and disabling
  92. interrupts.  This means high quality sound, almost as good as those
  93. dedicated non-multitasking sampler programs.  The catch is that nothing
  94. is recorded while the buffer is being dumped to disk.  So, if you can
  95. put up with brief pauses then you can use this mode.
  96.  
  97. Also, you can use AGMSRecordSound as an ordinary sound digitizer.  Just
  98. set the buffer size to fill up your whole memory (many smaller buffers
  99. are preferable since the interrupt routine can fill all but the one
  100. buffer being emptied - try buffers 20 size 100000 if you want to fill up
  101. 2 meg of memory).  Then set the sampling rate to one that uses all the
  102. CPU time for sampling (12kHz is good on my A2000, you will need larger
  103. rates on faster computers).
  104.  
  105. At ridiculously high sampling rates, the interrupt routine will be
  106. running flat out at a speed less than the one you requested.  This will
  107. result in a sample that is higher pitched than reality when you play it
  108. back.
  109.  
  110. IFF Information
  111.  
  112. The output file is an IFF file.  You have lots of command line options
  113. available for specifying optional information (like sample name, author
  114. etc).  Unfortunately some other sound sample processing programs can't
  115. handle the extra info (but AGMSPlaySound can!).  If you find that you
  116. want to type in more information than will fit on a command line, put
  117. the long command line into a script file and execute it.
  118.  
  119. Help
  120.  
  121. Most of the arguments to the program are obvious if you know audio
  122. terminology and computer terminology.  Anyways, you really don't have to
  123. specify any arguments except the name of the file to be created.  For
  124. on-line help, just type a ? as the argument to get the standard ARP /
  125. AmigaDOS command template.  A second ? typed at the template prompt will
  126. print the program credits.  The Verbose option also explains in more
  127. detail what the current settings are.  They are intuitively obvious
  128. (well, to me :-), but just in case you aren't intuitive about audio
  129. stuff, I'll describe the parameters in detail near the end of this
  130. message. 
  131.  
  132. Stolen Channels
  133.  
  134. This program won't let other programs steal its sound channel (channel 1
  135. to be specific).  It allocates it with maximum priority and thus hangs
  136. on to it.  If you are using AGMSPlaySound at the same time as you are
  137. recording, AGMSPlaySound will be bumped off channel 1 and will reappear
  138. on whatever other channel is free.  If someone else has channel 1 with
  139. the highest priority then AGMSRecordSound won't try recording.
  140.  
  141. Error Handling
  142.  
  143. The main source of errors is from the file system.  In particular, you
  144. may encounter a disk full error once in a while :-).  When an error
  145. occurs, AGMSRecordSound stops whatever it is doing and shuts down.  It
  146. will return a return code of 10 when something goes wrong. 
  147.  
  148. Now, more about those disk full errors.  I've set things up so that the
  149. file you are recording to is closed as if you had normally ended
  150. recording.  Since it is an IFF file, this means going back and filling
  151. in the size of the sample in previously written data near the beginning
  152. of the file.  It seems to work when using the old file system (OFS) but
  153. doesn't work under the fast file system (FFS).  Well, I tried. 
  154.  
  155. Technical Notes
  156.  
  157. Well, I found out a bit while writing this program.  Ok, two bits, make
  158. that three or four after I figured out the PS3 hardware :-).  For one
  159. thing, I found out how to use a digitizer: set CIAA port B to be all
  160. inputs (the parallel port).  Set CIAB port A pins POUT and SEL to be
  161. outputs.  The sampler spews out bytes to the parallel port with no
  162. handshaking, at some rate that I assume is pretty fast.  Some digitizers
  163. use a high level on SEL to connect the right audio input to the sampler
  164. and a high level on POUT to connect the left channel.  AMAS just
  165. seems to use the POUT bit to select left or right and seems to use right
  166. instead of left.  Whatever.  Once you have the desired channel, you can
  167. get a sample byte by reading the parallel port byte.  Subtract $80 from
  168. it to make it into a signed number and store it away.  Allow a small
  169. amount of time between switching from left to right (or vice versa) to
  170. let the sampler update its value (the time for a few instructions should
  171. be enough). 
  172.  
  173. The PerfectSound 3.0+ hardware is a different story.  The sample byte is
  174. split between the parallel port (CIAA port B) and the miscellaneous bits
  175. port (CIAB port A).  The low 6 bits of parallel data (PB5-PB0 in CIAA)
  176. are actually the high six bits of the sample (shift them left by two). 
  177. The low two bits of the sample are in the printer POUT (paper out) and
  178. BUSY signals (PA1-PA0 in CIAB).  As before, SEL (PA2 in CIAB) controls
  179. the left / right (zero is left).  So, what do PB6 and PB7 in CIAA do? A
  180. lot! The PerfectSound digitizer has a latched output, PB6 triggers the
  181. latch.  Set PB6 to zero to latch a value, read the sample, and set PB6
  182. back to one to start digitizing the next sample (I assume that's what
  183. it's doing).  PB7 is the gain control.  Normally you run the hardware
  184. with PB7 set to one.  If you toggle PB7 to zero and back, the volume
  185. control will be stepped up or down one notch of 16 levels.  SEL controls
  186. the volume direction (as well as left/right), zero for decreasing the
  187. volume.  The volume gain control wraps around from minimum to maximum
  188. and as far as I could tell, there isn't any way of telling what the
  189. current gain setting is or of setting it to minimum or maximum. 
  190.  
  191. I experimented a bit with ways of generating interrupts before I clued
  192. in that no interrupts happen while interrupts are disabled.  CIA timers
  193. running continously are good.  Audio channels themselves are also good
  194. for making a periodic interrupt (and at exactly the same speed as
  195. playback too).  I even tried using an audio channel to generate an
  196. interrupt slightly before the audio channel I was using for timing would
  197. signal the next time period.  The early interrupt routine would then
  198. busy wait for the timing channel interrupt.  The "slightly" grew to over
  199. 800 CPU clock cycles before I got slightly improved sound (hey - a way
  200. of determining how long those disabled times are), slightly improved at
  201. a very slow sampling rate that made it useless. 
  202.  
  203. Feedback
  204.  
  205. If you have any feature requests or find any bugs, please send me a
  206. message.  I'm on several of the Ottawa BBX's (a BBS written by SteveX)
  207. and my commercial info service names are listed in the program's second
  208. help message.
  209.  
  210. File/A
  211.  
  212. Names the file where the sample will be stored.  Any existing file by
  213. this name will be erased.  A required keyword.
  214.  
  215. Verbose/S
  216.  
  217. When this command switch is used, lots of interesting messages will be
  218. displayed.  All the parameter settings will be shown.  During recording
  219. you can see what buffers are being dumped.
  220.  
  221. Buffers/K
  222.  
  223. This parameter specifies the number of buffers (any old ram is used) to
  224. use for recording the sound.  You need at least 2.  While the system is
  225. recording one buffer, the others can be emptied to disk.  Try the
  226. verbose command switch to watch the buffers being emptied and to see how
  227. changing the number of buffers affects performance.  Gee, I sure like
  228. these reuseable documentation paragraphs - I just changed "play" to
  229. "record" :-)
  230.  
  231. Size/K
  232.  
  233. This parameter sets the size of each sound buffer.  The default is
  234. 100000 bytes, the maximum is about 2000000000 bytes :-).  As mentioned
  235. elsewhere, AGMSRecordSound doesn't need to use any chip ram at all.
  236. Buffers use general purpose ram.  For best performance, use large
  237. buffers.  That is because DOS can write a large chunk of data faster
  238. than several small chunks (less overhead).
  239.  
  240. Hz/K
  241.  
  242. This parameter controls the record rate.  It is in units of samples per
  243. second, or bytes per second since each sample is one byte long (compact
  244. disks have 2 byte samples and thus sound better).  The default is 7781
  245. hz, less for the PerfectSound version due to extra overhead in reading
  246. each sample.  The highest rate on my A2000 that lets you record and
  247. simultaneously save to disk (no gaps) is about 8500 hz.  A speed of
  248. 12000 hz is good for better quality sound with small gaps between
  249. buffers.  See the discussion on sound quality about picking values for
  250. hz. 
  251.  
  252. The Hz setting is internally translated into a code value for the
  253. hardware.  Since the hardware doesn't have all that many code values,
  254. only a few frequencies are actually available.  A frequency near the one
  255. you specified will be picked.  Note that this is half the playback code
  256. value since playback plays words (pairs of bytes) while we only record a
  257. byte at a time. 
  258.  
  259. Name/K
  260.  
  261. This lets you specify the name of the song or whatever you have
  262. recorded.  If it is more than one word, put it in double quotes.
  263.  
  264. Copyright/K
  265.  
  266. This is for the copyright notice.  Specify something like "1991,
  267. Alexander G. M. Smith".
  268.  
  269. Author/K
  270.  
  271. The author of this sample.  If it is music then that is relatively
  272. obvious.  I don't know who is the author of the sound of a toilet
  273. flushing, maybe the toilet manufacturer? Don't specify it if you don't
  274. want an author.
  275.  
  276. Anno=Annotation/...
  277.  
  278. An endless list of annotation.  You can use the short form of the
  279. keyword (Anno) or the long form (Annotation).  The values are strings
  280. (as many as you want) of annotation text.  It can be whatever you want,
  281. usually something that describes the sample: anno "This is my first hour
  282. long sound sample" "The sound of the dripping tap was created by using
  283. the kitchen sink." "Use at your own risk."
  284.  
  285. Control-C Etc.
  286.  
  287. Control-C will abort the program as soon as possible.  This can take a
  288. while if it is busy dumping a buffer.
  289.  
  290. Control-E will step up the volume on the PerfectSound hardware, if you
  291. are using AGMSRecordSoundPS3 (does nothing otherwise).  Don't hit the
  292. key too fast, when AGMSRecordSoundPS3 is running the rest of the
  293. operating system is slowed down and can't process your signals fast
  294. enough.  In fact, it's so slow that you can overflow something (probably
  295. the supervisor stack) by typing a lot of Control-CDEF's, even in another
  296. program's window.  The result is a visit from the guru (crash #3
  297. usually). 
  298.  
  299. Control-F is used by the interrupt routine to tell the main program that
  300. there is another full buffer.  You can use it to if you want to wake up
  301. a poor little sleepy program (doesn't do any harm, unless you type it
  302. too quickly :-). 
  303.  
  304. - Alex
  305.